package com.itheima.reggie.Controller;

import com.itheima.reggie.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.UUID;

/**
 * 文件上传与下载
 */
@Slf4j
@RestController
@RequestMapping("/common")
public class CommonController {

//  将文件转存路径,即目录配置到yml文件中
    @Value("${reggis.path}")
    private String filePath;

//  文件上传必须是post请求
    @PostMapping("/upload")
//  这里的参数类型必须是MultipartFile才能接受文件上传，而参数名必须与前端的name属性的名称一致,
//  否则接收不到数据
//  文件是放在临时目录的，不转存的话一旦请求结束该文件就会被删除，所以需要将文件转存到别的目录
    public R<String> upload(MultipartFile file){

//      获取上传的文件名
        String originalFilename = file.getOriginalFilename();


//      substring:
//     （1）substring是用来截取字符串的，根据参数的个数不同，方法含义也不同；
//     （2）substring(0,2)这个只含开头不含结尾，因此截取是截取两个字符，从第一个到第二个字符，
//         不包含第三个。
//     （3）substring(2)这个表示截掉前两个，得到后边的新字符串

//      StringObject.lastIndexOf(substring,startindex)：
//      startindex：可选参数，用于指定在字符串中开始查找的位置，在这个位置从后向前查找。它的取值
//      范围是0~stringObject.length-1,指的是字符串的下标。如果省略该参数，则从字符串的最后一个
//      字符开始查找。如果要查找的子字符串没有出现，则返回-1。


//      截取上传的文件名的后缀
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));

//      创建一个目录对象
        File dir = new File(filePath);
//      判断当前文件目录是否存在
        if(!dir.exists()){
//      目录不存在，需要创建
            dir.mkdirs();
        }

//      使用UUID随机生成文件名，防止文件名称重复造成文件覆盖，再加上原文件名(上传文件的文件名)的后缀
        String filename = UUID.randomUUID().toString()+suffix;

        try {
//          将文件转存到指定位置，目录+文件名，目录在yml配置文件中定义
            file.transferTo(new File(filePath+filename));
        } catch (IOException e) {
            e.printStackTrace();
        }

//      返回文件名，后面添加菜品要用
        return R.success(filename);
    }



    /**
     * 文件下载
     * @param name
     * @param response
     */
    @GetMapping("/download")
    public void download(String name, HttpServletResponse response){

        try {
//      输入流，通过输入流读取文件内容
            InputStream inputStream = new FileInputStream(new File(filePath + name));
//      输出流，因为要将数据响应给浏览器，所以需要通过response响应对象获取输出流对象,通过输出流将
//      文件写回浏览器，在浏览器展示图片
            ServletOutputStream outputStream = response.getOutputStream();
//      设置响应的文件类型
            response.setContentType("image/jpeg");

//      读取输入流数据并写入输出流
            int len=0;
            byte[] bytes=new byte[1024];
            while ((len=inputStream.read(bytes))!=-1){
                outputStream.write(bytes,0,len);
                outputStream.flush();
            }

            inputStream.close();
            outputStream.close();

        } catch (Exception e) {
            e.printStackTrace();
        }


    }
}
